package br.com.equus.bean;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.model.SelectItem;

import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

import br.com.arquitetura.bean.PaginableBean;
import br.com.arquitetura.excecao.ExcecaoUtil;
import br.com.arquitetura.util.ComboUtil;
import br.com.arquitetura.util.FacesMessagesUtil;
import br.com.arquitetura.util.Mascara;
import br.com.arquitetura.util.StringUtil;
import br.com.equus.entidade.Municipio;
import br.com.equus.entidade.Proprietario;
import br.com.equus.entidade.TipoProprietario;
import br.com.equus.entidade.UF;
import br.com.equus.util.Constantes;
import br.com.equus.util.CpfUtil;

@ManagedBean(name = "proprietarioBean")
@ViewScoped
public class ProprietarioBean extends PaginableBean<Proprietario> {

	private static final long serialVersionUID = 1L;

	private List<SelectItem> listaTipoProprietario;

	private Integer idTipoProprietario;

	private Integer idUf;
	private Integer idMunicipio;

	private List<SelectItem> ufs;

	private List<SelectItem> municipios;

	public ProprietarioBean() {
	}

	@Override
	public void verificarAcesso() {
		acessoBean.bloquearTela("ROLE_PROPRIETARIO");

	}

	@SuppressWarnings("unchecked")
	@PostConstruct
	public void carregarListas() {
		try {
			listaTipoProprietario = ComboUtil.getItens(universalManager.listBy(new TipoProprietario(true)));
			Collections.sort(listaTipoProprietario, new Comparator<SelectItem>() {
				@Override
				public int compare(SelectItem o1, SelectItem o2) {
					return o1.getLabel().compareTo(o2.getLabel());
				}
			});

			ufs = ComboUtil.getItens(universalManager.listBy(new UF()));
			Collections.sort(ufs, new Comparator<SelectItem>() {
				@Override
				public int compare(SelectItem o1, SelectItem o2) {
					return o1.getLabel().compareTo(o2.getLabel());
				}
			});
			municipios = new ArrayList<SelectItem>();

		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

	}

	@Override
	public String save() {
		try {
			getModel().setTipoProprietario(new TipoProprietario(idTipoProprietario));

			if (idMunicipio != null && !idMunicipio.equals(0)) {
				getModel().setMunicipio(new Municipio(idMunicipio));
			}
			// retira mascara CPF
			if (getModel().getCpf() != null) {
				getModel().setCpf(StringUtil.unformat("###.###.###-##", getModel().getCpf()));
			}
			// retira mascara telefone
			if (getModel().getTelefoneCelular() != null && !getModel().getTelefoneCelular().trim().equals("")) {
				getModel().setTelefoneCelular(getModel().getTelefoneCelular().trim().replaceAll("[()-]", ""));
			}
			if (getModel().getTelefoneComercial() != null && !getModel().getTelefoneComercial().trim().equals("")) {
				getModel().setTelefoneComercial(getModel().getTelefoneComercial().trim().replaceAll("[()-]", ""));
			}
			if (getModel().getTelefoneResidencial() != null && !getModel().getTelefoneResidencial().trim().equals("")) {
				getModel().setTelefoneResidencial(getModel().getTelefoneResidencial().trim().replaceAll("[()-]", ""));
			}

			if (!camposValidos()) {
				return ERROR;
			}

			super.save();
			limparCampo();
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

		return SUCCESS;

	}

	private void limparCampo() {
		idTipoProprietario = null;
		idUf = null;
		idMunicipio = null;
	}

	@SuppressWarnings("unchecked")
	public void changeUF(AjaxBehaviorEvent evt) {
		try {
			Municipio municipio = new Municipio();
			municipio.setUf(new UF(idUf));
			municipios = ComboUtil.getItens(universalManager.listBy(municipio));
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

	}

	@Override
	public String load() {
		super.load();
		idTipoProprietario = getModel().getTipoProprietario().getId();

		return SUCCESS;
	}

	public boolean camposValidos() throws Exception {

		if (getModel().getNome() == null || getModel().getNome().trim().equals("")) {
			FacesMessagesUtil.addErrorMessage("Nome ", Constantes.CAMPO_OBRIGATORIO);
			return false;
		}
		if (getModel().getCpf() == null || getModel().getCpf().trim().equals("")) {
			FacesMessagesUtil.addErrorMessage("CPF ", Constantes.CAMPO_OBRIGATORIO);
			return false;
		}

		if (idTipoProprietario == null || idTipoProprietario.equals(0)) {
			FacesMessagesUtil.addErrorMessage("Tipo de Proprietário ", Constantes.CAMPO_OBRIGATORIO);
			return false;
		}
		if (getModel().getDtnascimento() == null) {
			FacesMessagesUtil.addErrorMessage("Data de Nascimento ", Constantes.CAMPO_OBRIGATORIO);
			return false;
		}
		if (getModel().getLograudouro() == null || getModel().getLograudouro().trim().equals("")) {
			FacesMessagesUtil.addErrorMessage("Endereço ", Constantes.CAMPO_OBRIGATORIO);
			return false;
		}

		// Se selecionar uf e nao selecionar municipio
		if ((idUf != null && !idUf.equals(0)) && (idMunicipio == null || idMunicipio.equals(0))) {
			FacesMessagesUtil.addErrorMessage(" ", " É necessário escolher um Município");
			return false;
		}

		// Validar CPF
		if (!CpfUtil.isValidCPF(getModel().getCpf())) {
			FacesMessagesUtil.addErrorMessage("CPF ", "Inválido");
			return false;
		}

		// CPF unico
		if (getModel().getCpf() != null) {
			Proprietario pro = new Proprietario();
			pro.setCpf(getModel().getCpf());
			List<Proprietario> lista = universalManager.listBy(pro);
			if (lista != null && !lista.isEmpty() && !lista.get(0).getId().equals(getModel().getId())) {
				FacesMessagesUtil.addErrorMessage("CPF ", "Já cadastrado");
				return false;
			}
		}

		return true;
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public LazyDataModel<Proprietario> getLazyDataModel() {
		try {
			if (lazyDataModel == null)
				lazyDataModel = new LazyDataModel() {

					private static final long serialVersionUID = 2595093445602418759L;

					@Override
					public List load(int first, int pageSize, String sortField, SortOrder sortOrder, Map filters) {
						try {

							boolean order = false;
							if (sortOrder.equals(SortOrder.ASCENDING)) {
								order = true;
							}

							if (getFilters() != null && !getFilters().isEmpty()) {
								filters.putAll(getFilters());
							}

							// trata o filtro do cpf.
							if (filters != null) {
								Set<String> chaves = filters.keySet();
								for (String fil : chaves) {
									if (fil.trim().equalsIgnoreCase("cpf")) {
										filters.put("cpf", Mascara.retirarMascara((String) filters.get(fil)));
									}
								}
							}

							// Reduzindo o contador depois de filtrado
							int rowCount = universalManager.getCount(first, pageSize, sortField, order, filters, getModel().getClass())
									.intValue();
							lazyDataModel.setRowCount(rowCount);
							return universalManager.paginate(first, pageSize, sortField, order, filters, getModel().getClass());
						} catch (Exception e) {
							ExcecaoUtil.tratarExcecao(e);
						}
						return null;
					}
				};

		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return lazyDataModel;
	}

	@Override
	public Proprietario createModel() {
		return new Proprietario();
	}

	@Override
	public String getQualifiedName() {
		return "Proprietário";
	}

	@Override
	public boolean isFeminino() {
		return false;
	}

	@Override
	public Map<String, String> getFilters() {
		return null;
	}

	public List<SelectItem> getListaTipoProprietario() {
		return listaTipoProprietario;
	}

	public void setListaTipoProprietario(List<SelectItem> listaTipoProprietario) {
		this.listaTipoProprietario = listaTipoProprietario;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public Integer getIdTipoProprietario() {
		return idTipoProprietario;
	}

	public void setIdTipoProprietario(Integer idTipoProprietario) {
		this.idTipoProprietario = idTipoProprietario;
	}

	public List<SelectItem> getUfs() {
		return ufs;
	}

	public void setUfs(List<SelectItem> ufs) {
		this.ufs = ufs;
	}

	public Integer getIdUf() {
		return idUf;
	}

	public void setIdUf(Integer idUf) {
		this.idUf = idUf;
	}

	public Integer getIdMunicipio() {
		return idMunicipio;
	}

	public void setIdMunicipio(Integer idMunicipio) {
		this.idMunicipio = idMunicipio;
	}

	public List<SelectItem> getMunicipios() {
		return municipios;
	}

	public void setMunicipios(List<SelectItem> municipios) {
		this.municipios = municipios;
	}

}
